/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package edu.ucuenca.ec.nosql.controller;

import edu.ucuenca.ec.nosql.conexion.DriverMongoDB;
import edu.ucuenca.ec.nosql.modelos.Persona;
import edu.ucuenca.ec.nosql.modelos.Producto;
import edu.ucuenca.ec.nosql.security.CarritoSession;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

/**
 *
 * @author mivkys
 */
@ManagedBean(name = "comprasController")
@SessionScoped
public class ComprasController implements Serializable {

    private Producto selected;
    private Persona selectedPersona;
    private Persona logeado;
    private List<Producto> itemsProductos;
    private List<Producto> allProductos;
    private List<Persona> allUsuarios;
    private List<String> groupThemes;
    private String filtrador;
    private int cantidad;

    public ComprasController() {

    }

    @PostConstruct
    public void init() {

        DriverMongoDB.setDB_Mongo("online");
        allProductos = DriverMongoDB.findAll("producto");
        itemsProductos = CarritoSession.getAllProductos();
        allUsuarios = new ArrayList<>();////aki se carga los datos desde neo4j
        if (itemsProductos == null) {
            itemsProductos = new ArrayList<>();
            CarritoSession.setAllProductos(itemsProductos);
        }
        cargarGroups();
        logeado = CarritoSession.getUsuario();/// la persona logeada
        selectedPersona= new Persona();
    }

    public void prepareLogin() {
        System.out.println("Si prepara");
        selectedPersona = new Persona();
    }

    public void login() {
        System.out.println("Si logeo");
        for (Persona allUsuario : allUsuarios) {
            if (allUsuario.getUsername().equalsIgnoreCase(selectedPersona.getUsername())) {
                selectedPersona = allUsuario;
                CarritoSession.setUsuario(selectedPersona);
                logeado = selectedPersona;
                break;
            }
        }
    }

    public void logout() {
        System.out.println("Si despogeo");
        logeado = null;
        CarritoSession.setUsuario(logeado);
    }

    public void prepareCreate() {
        System.out.println("Si vino");
        selected = new Producto();
    }

    public void agregar(Producto add) {
        System.out.println("si llega " + add.getTitle());
        if (add != null) {
            if (!itemsProductos.contains(add)) {
                itemsProductos.add(add);
                CarritoSession.setAllProductos(itemsProductos);
            }
        }
    }

    public void quitar(Producto add) {
        System.out.println("si llega " + add.getTitle());
        if (add != null) {
            itemsProductos.remove(add);
            CarritoSession.setAllProductos(itemsProductos);
        }
    }

    public List<String> completeTheme(String query) {
        List<String> allThemes = groupThemes;
        List<String> filteredThemes = new ArrayList<String>();

        for (int i = 0; i < allThemes.size(); i++) {
            String skin = allThemes.get(i);
            if (skin.toLowerCase().startsWith(query)) {
                filteredThemes.add(skin);
            }
        }

        return filteredThemes;
    }

    private void cargarGroups() {
        Set<String> sets = new HashSet<>();
        for (Producto allProducto : allProductos) {
            sets.add(allProducto.getGroup());
        }
        groupThemes = new ArrayList<>(sets);
    }

    /**
     * @return the selected
     */
    public Producto getSelected() {
        return selected;
    }

    /**
     * @param selected the selected to set
     */
    public void setSelected(Producto selected) {
        this.selected = selected;
    }

    /**
     * @return the itemsProductos
     */
    public List<Producto> getItemsProductos() {
        return itemsProductos;
    }

    /**
     * @param itemsProductos the itemsProductos to set
     */
    public void setItemsProductos(List<Producto> itemsProductos) {
        this.itemsProductos = itemsProductos;
    }

    /**
     * @return the allProductos
     */
    public List<Producto> getAllProductos() {
        return allProductos;
    }

    /**
     * @param allProductos the allProductos to set
     */
    public void setAllProductos(List<Producto> allProductos) {
        this.allProductos = allProductos;
    }

    /**
     * @return the groupThemes
     */
    public List<String> getGroupThemes() {
        return groupThemes;
    }

    /**
     * @param groupThemes the groupThemes to set
     */
    public void setGroupThemes(List<String> groupThemes) {
        this.groupThemes = groupThemes;
    }

    /**
     * @return the filtrador
     */
    public String getFiltrador() {
        return filtrador;
    }

    /**
     * @param filtrador the filtrador to set
     */
    public void setFiltrador(String filtrador) {
        this.filtrador = filtrador;
    }

    /**
     * @return the cantidad
     */
    public int getCantidad() {
        return cantidad;
    }

    /**
     * @param cantidad the cantidad to set
     */
    public void setCantidad(int cantidad) {
        this.cantidad = cantidad;
    }

    /**
     * @return the selectedPersona
     */
    public Persona getSelectedPersona() {
        return selectedPersona;
    }

    /**
     * @param selectedPersona the selectedPersona to set
     */
    public void setSelectedPersona(Persona selectedPersona) {
        this.selectedPersona = selectedPersona;
    }

    /**
     * @return the logeado
     */
    public Persona getLogeado() {
        return logeado;
    }

    /**
     * @param logeado the logeado to set
     */
    public void setLogeado(Persona logeado) {
        this.logeado = logeado;
    }

    /**
     * @return the allUsuarios
     */
    public List<Persona> getAllUsuarios() {
        return allUsuarios;
    }

    /**
     * @param allUsuarios the allUsuarios to set
     */
    public void setAllUsuarios(List<Persona> allUsuarios) {
        this.allUsuarios = allUsuarios;
    }
}
